package com.smart.community.region.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.smart.community.commons.constant.BusinessConstants;
import com.smart.community.commons.enums.SystemStatusEnum;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 区域实体类
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sc_region")
public class Region implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 区域ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 区域编码
     */
    @TableField("region_code")
    private String regionCode;

    /**
     * 区域名称
     */
    @TableField("region_name")
    private String regionName;

    /**
     * 父区域ID，0表示顶级区域
     */
    @TableField("parent_id")
    private Long parentId;

    /**
     * 区域层级：1-5
     */
    @TableField("region_level")
    private Integer regionLevel;

    /**
     * 区域级别（兼容字段）
     */
    @TableField("level")
    private Integer level;

    /**
     * 区域类型：1-省，2-市，3-区县，4-街道，5-社区
     */
    @TableField("region_type")
    private Integer regionType;

    /**
     * 区域描述
     */
    @TableField("description")
    private String description;

    /**
     * 区域地址
     */
    @TableField("address")
    private String address;

    /**
     * 面积（平方公里）
     */
    @TableField("area")
    private BigDecimal area;

    /**
     * 人口数量
     */
    @TableField("population")
    private Integer population;

    /**
     * 纬度
     */
    @TableField("latitude")
    private BigDecimal latitude;

    /**
     * 经度
     */
    @TableField("longitude")
    private BigDecimal longitude;

    /**
     * 管理员ID
     */
    @TableField("manager_id")
    private Long managerId;

    /**
     * 联系电话
     */
    @TableField("contact_phone")
    private String contactPhone;

    /**
     * 联系邮箱
     */
    @TableField("contact_email")
    private String contactEmail;

    /**
     * 邮政编码
     */
    @TableField("postal_code")
    private String postalCode;

    /**
     * 社区数量
     */
    @TableField("community_count")
    private Integer communityCount;

    /**
     * 状态：0-禁用，1-启用
     */
    @TableField("status")
    private Integer status;

    /**
     * 排序字段
     */
    @TableField("sort_order")
    private Integer sortOrder;

    /**
     * 逻辑删除：0-未删除，1-已删除
     */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;

    /**
     * 创建人ID
     */
    @TableField("create_by")
    private Long createBy;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新人ID
     */
    @TableField("update_by")
    private Long updateBy;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // ==================== 业务方法 ====================

    /**
     * 获取状态文本
     */
    @JsonIgnore
    public String getStatusDesc() {
        return SystemStatusEnum.isEnabled(status) ? "启用" : "禁用";
    }

    /**
     * 获取区域类型文本
     */
    @JsonIgnore
    public String getRegionTypeText() {
        return BusinessConstants.getRegionTypeName(regionType);
    }

    /**
     * 判断是否为顶级区域
     */
    @JsonIgnore
    public boolean isRoot() {
        return parentId != null && parentId == 0;
    }

    /**
     * 判断是否为叶子节点
     */
    @JsonIgnore
    public boolean isLeaf() {
        return regionType != null && regionType == 5;
    }
} 